前言
今天想做一個測試,就是用循環神經網路(RNN)處理 MNIST數據集,通常 MNIST 是用卷積神經網路處理,RNN 更適合處理序列數據,但也可以將圖像視為一系列行或列來應用它。
基本介紹
循環神經網路(Recurrent Neural Network,簡稱 RNN)是一種專門用於處理序列數據的神經網路架構,和傳統的前饋神經網路不同,RNN 在結構中引入了循環連接,就可以保留先前時間步的信息,所以適合處理時間序列或其他順序數據,像是文本、語音和音樂等。
主要特點
1.序列處理:
RNN 可以逐步處理序列中的每個元素,並在每一步中保留隱藏狀態以捕捉前面元素的信息。
2.共享參數:
所有時間步用相同的權重和偏置,讓模型在處理不同時間步時有相同的參數,這樣可以有效減少模型的複雜度。
3.隱藏狀態:
RNN 擁有一個隱藏狀態,它在每一步中更新並保留序列信息,這可以讓模型對過去的信息進行建模。
變體
變體是對某種基本模型或算法的不同版本或改進,這些變體目的是解決特定問題或提高模型性能。
而這便以 RNN 的變體為例介紹以下兩種:
1.長短期記憶網絡(LSTM):
LSTM 是一種特殊的 RNN,設計用於解決長期依賴問題,它通過引入遺忘門、輸入門和輸出門來控制信息的流入和流出,而能更有效地記住重要信息。
2.門控循環單元(GRU):
GRU 是 LSTM 的一個簡化版本,具有相似的性能,但參數更少,計算量更小,它合併了 LSTM 的一些門,提供了更高效的計算。
使用 RNN 處理 MNIST
以下是利用 RNN 處理 MNIST 的範例程式碼:
前面步驟其實差不多,但因為我要讓它示範出輸出結果所以還是都再打一次。
先加載和預處理數據:
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
重新排列數據來適應 RNN ,括號內分別是樣本數、時間步和特徵數,將每個圖像的每一行視為一個時間步。
x_train = x_train.reshape((x_train.shape[0], 28, 28))
x_test = x_test.reshape((x_test.shape[0], 28, 28))
定義 RNN 模型,編譯並訓練:
model = models.Sequential()
model.add(layers.SimpleRNN(128, activation='relu', input_shape=(28, 28)))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=128, validation_split=0.2)
最後評估模型,測試它的準確率:
test_loss, test_accuracy = model.evaluate(x_test, y_test)
print(f'test: {test_accuracy:.4f}')
輸出結果為如圖,
特別注意: